package cn.schoolwow.quickflow.service.flowContext.putData;

import cn.schoolwow.quickflow.QuickFlow;
import cn.schoolwow.quickflow.domain.FlowContext;
import cn.schoolwow.quickflow.domain.FlowContextDataOption;
import cn.schoolwow.quickflow.domain.FlowDataFeature;
import cn.schoolwow.quickflow.dto.FlowContextDataRange;

import java.util.Map;

public interface FlowContextPutDataOperation {
    /**
     * 设置线程本地数据
     */
    FlowContext putThreadLocalData(String key, Object value, FlowDataFeature... flowDataFeatures);

    /**
     * 设置当前流程数据
     */
    FlowContext putCurrentFlowData(String key, Object value, FlowDataFeature... flowDataFeatures);

    /**
     * 设置当前复合流程数据
     */
    FlowContext putCurrentCompositeFlowData(String key, Object value, FlowDataFeature... flowDataFeatures);

    /**
     * 设置临时数据
     */
    FlowContext putTemporaryData(String key, Object value);

    /**
     * 设置流程返回数据
     */
    FlowContext putReturnData(String key, Object value);

    /**
     * 设置上下文数据
     */
    FlowContext putData(String key, Object value, FlowDataFeature... flowDataFeatures);

    /**
     * 设置全局线程本地数据
     */
    FlowContext putContextThreadLocalData(String key, Object value, FlowDataFeature... flowDataFeatures);

    /**
     * 设置全局上下文数据
     */
    FlowContext putContextData(String key, Object value, FlowDataFeature... flowDataFeatures);

    /**
     * 设置全局上下文临时数据
     */
    FlowContext putContextTemporaryData(String key, Object value);

    /**
     * 设置流程数据
     */
    FlowContext putFlowContextData(String key, Object value, FlowContextDataRange flowContextDataRange, FlowDataFeature... flowDataFeatures);

    /**
     * 设置流程数据
     */
    FlowContext putFlowContextDataMap(Map<String,Object> dataMap, FlowContextDataRange flowContextDataRange, FlowDataFeature... flowDataFeatures);

    /**
     * 设置流程数据
     */
    FlowContext putFlowContextData(FlowContextDataOption flowContextDataOption);

    /**
     * 移除上下文数据
     */
    FlowContext removeData(String key);

    /**
     * 移除流程数据
     */
    FlowContext removeData(String key, FlowContextDataRange flowContextDataRange);

    /**
     * 加入新的流程对象
     */
    FlowContext joinQuickFlow(QuickFlow quickFlow);
}
